#ifndef __EVNET_H
#define __EVNET_H

typedef enum {
    EGUI_INIT,
    EGUI_UPDATE,
    EGUI_ERR,
} EGUI_Actions;

typedef enum {
    // single short/long key
    KEY1_SHORT,
    KEY2_SHORT,
    KEY3_SHORT,
    KEY4_SHORT,
    KEY5_SHORT,
    KEY1_LONG,
    KEY2_LONG,
    KEY3_LONG,
    KEY4_LONG,
    KEY5_LONG,
    KEY2_LONG_CONT,
    KEY3_LONG_CONT,
    KEY4_LONG_CONT,
    KEY5_LONG_CONT,
    // combine short/long key
    KEY1_KEY3_SHORT,
    KEY2_KEY3_SHORT,
    KEY4_KEY5_SHORT,
    KEY1_KEY3_LONG,
    KEY2_KEY3_LONG,
    KEY3_KEY4_LONG,
    KEY4_KEY5_LONG,

    // nokey timeout event
    KEY_TIMEOUT_5S,
    KEY_TIMEOUT_10S,
    KEY_TIMEOUT_30S,
    KEY_TIMEOUT_30MIN,

    // tick event
    KEY_TICK_1S,
    KEY_TICK_10S,

    //all
    KEY_NULL,
} eKeyVal;

#define NO_KEY	(-1)

enum {
    id_normal, 
    id_standby,
    id_shutdown,
    id_shortcutmenu,
    id_mainmenu1,
    id_mainmenu2,
    id_compass_cal,
    id_gun_cal,
    id_bad_pixel_cal,
    id_time_set,
    id_image,
    id_image_adjust,
    id_image_setting,
    id_calibration,
    id_camera_setting,
    id_WB_setting,
    id_reticle,
    id_cross_color_setting,
    id_nine_axis_setting,
    id_system,
    id_language,
    id_disk_format,
    id_factory_reset,
    id_ver_info,
    id_core_module_update,
    id_engineering,

    id_NULL,
};

enum {
    /* menu */
    nid_menu_image = 0,
    nid_menu_camera_setting,    // 可见光
    nid_menu_reticle,
    nid_menu_nine_axis_setting,  // 红外
    nid_menu_system,
    nid_menu_exit,
    nid_menu_end,

    /* image_adjust */
    nid_image_adjust_brightness = 0,
    nid_image_adjust_contrast,
    nid_image_adjust_detail_enhance,
    nid_image_adjust_sharpness,
    nid_image_adjust_gamma,
    nid_image_adjust_img_3D_denoise,
    nid_image_adjust_img_2D_denoise,
    nid_image_adjust_exit,
    nid_image_adjust_end,

    /* image_setting */
    nid_image_setting_mirror = 0,
    nid_image_setting_flip,
    nid_image_setting_EIS,
    nid_image_setting_return,
    nid_image_setting_end,

    /* camera_setting */
    nid_camera_setting_VIS_mode = 0,
    nid_camera_setting_EC,
    nid_camera_setting_WDR,
    nid_camera_setting_WB,
    nid_camera_setting_return,
    nid_camera_setting_end,

    /* system */
    nid_system_langua = 0,
    nid_system_factory_reset,
    nid_system_ver_info,
    nid_system_return,
    nid_system_end,

    nid_null,
};

enum time_set {
	TIME_SET_YEAR,
	TIME_SET_MON,
	TIME_SET_DAY,
    TIME_SET_TIME_FORMAT,
	TIME_SET_HOUR,
	TIME_SET_MIN,
    // TIME_SET_SEC,
    TIME_SET_END,   // exit
};

enum sonser_type {
    TYPE_FPGA_256X192,
    TYPE_FPGA_384X288,
    TYPE_FPGA_640X512,
    TYPE_SENSOR_256X192,
    TYPE_SENSOR_384X288,
    TYPE_SENSOR_640X512,
    TYPE_VIS_1920X1080,
};

enum output_setting {
    OUTPUT_SETTING_FORMAT,
    OUTPUT_SETTING_RES,
    OUTPUT_SETTING_FRAME_RATE,
    OUTPUT_SETTING_RETURN,
};

enum output_format {
    OUTPUT_FORMAT_SDI,
    OUTPUT_FORMAT_HDMI,
    OUTPUT_FORMAT_AHD,
    OUTPUT_FORMAT_CVI,
    OUTPUT_FORMAT_TVI,
    OUTPUT_FORMAT_CVBS,
    OUTPUT_FORMAT_END,
};

enum output_res {
    OUTPUT_RES_1920X1080,
    OUTPUT_RES_1280X1024,
    OUTPUT_RES_1280X720,
    OUTPUT_RES_1024X768,
    OUTPUT_RES_720X576,
    OUTPUT_RES_720X480,
    OUTPUT_RES_END,
};

enum output_frame_rate {
    OUTPUT_FRAME_RATE_60FPS,
    OUTPUT_FRAME_RATE_50FPS,
    OUTPUT_FRAME_RATE_30FPS,
    OUTPUT_FRAME_RATE_25FPS,
    OUTPUT_FRAME_RATE_END,
};

typedef struct {
    int year;
    int month;
    int day;
    int time_format;    // default:0 24h
    int hour;
    int minute;
    int second;
} time_node_t;

typedef struct {
    int nid;
    int min;
    int max;
    int val;
} snode_t;

typedef struct {
    snode_t center_x;
    snode_t center_y;
} coord_node_t;

typedef struct {
    snode_t	curnode;
    snode_t *node[10];
} menu_node_t;

typedef struct {
    snode_t wifi;	            // wifi 开关
    snode_t color_mode;	        // 色彩模式 0：黑热，1：白热，2：红热，3：蓝绿火焰，4：热铁，5：频谱 默认：黑热
    snode_t color_mode_tick;    // 色彩模式提示时间 3s
    snode_t img_brightness;     // 图像亮度
    snode_t img_brightness_tick;// 图像亮度
    snode_t img_contrast;	    // 图像对比度
    snode_t img_detail_enhance; // 图像细节增加
    snode_t img_3D_denoise;     // 图像时域降噪（3D去噪）
    snode_t img_2D_denoise;     // 图像空域降噪（2D去噪）
    snode_t img_gamma;	        // 图像伽马强度
    snode_t brightness;	        // 屏幕亮度
    snode_t img_sharpness;	    // 图像锐度
    snode_t hd_mode;            // 超清模式开关
    snode_t hue_mode;           // 冷暖色调
    snode_t shutter_mode;       // 快门模式，0：自动，1：手动 默认：自动
    snode_t mic;                // mic 开关
    snode_t compass;            // 罗盘开关
    snode_t compass_angle;      // 罗盘角度值
    snode_t motion;             // 运动传感器开关
    snode_t hori_angle;         // 横滚角
    snode_t vert_angle;         // 俯仰角
    snode_t pip;                // pip 开关
    snode_t zoom;               // 放大倍数 1X，2X，3X，4X
    snode_t bat_level;          // 电池电量，1~5
    snode_t charge_state;       // 充电状态
    snode_t low_bat_tip;        // 低电量提示倒计时 30s
    snode_t shutdown_tip;       // 低电量关机图标显示倒计时 2s
    snode_t capture;            // 拍照
    snode_t rec;                // 录像
    snode_t language;		    // 语言 0：英语，1：中文 默认：英语
    snode_t time_set;           // 时间设置
    time_node_t time;
    snode_t factory_reset;      // 恢复出厂设置
    snode_t ver_info;           // 产品信息
    snode_t disk_format;        // 磁盘格式化
    snode_t compass_cal;        // 罗盘矫正
    snode_t status_sel;         // 状态选择
    snode_t menu_entry;         // 选中当前菜单选项
    snode_t upgrade_percent;    // 机芯升级百分比
    snode_t image;              // 0:image adjust 1:image setting 2:return
    snode_t sensor_type;        // 探测器类型
    snode_t image_miror;        // 镜像
    snode_t image_flip;         // 翻转
    snode_t EIS;                // 电子防抖 默认：打开
    snode_t output_format;      // 选择的输出格式
    snode_t output_res_type;    // 选择的输出分辨率
    snode_t output_frame_rate;  // 选择的输出帧率
    snode_t calibration;
    snode_t camera_setting;     // 微光设置 0：日夜模式，1：曝光补偿，2：宽动态，3：白平衡设置
    snode_t VIS_sensor_fps;
    snode_t VIS_mode;           // 0：白天，1：夜晚，2：傍晚 默认：白天
    snode_t EC;                 // 曝光补偿 选值范围，-2.0，-1.7，-1.3，-1.0，-0.7，-0.3，0，+0.3，+0.7，+1.0，+1.3，+1.7，+2.0，默认值是 0
    snode_t WDR;                // 宽动态 0：低，1：中，2：高 默认：中
    snode_t WB_mode;            // 白平衡 0：自动，1：手动 默认：自动
    snode_t color_temp;         // 色温 0：3000K，1：5000K，2：8000K 默认：5000K
    snode_t reticle;            // 十字分化 0：关，1：开
    snode_t cross_type;         // 0：720x480，1：1280x720
    snode_t cross_color;        // 0：黑色、1：白色、2：红热、3：绿色
    snode_t warning_tick;
    snode_t save_para_tick;     // 参数保存倒计时
    snode_t bg_cal_tick;        // 背景校正提示倒计时
    snode_t cal_status[7];      // 探测器校正状态 0：未操作，1：成功，2：失败
    snode_t nine_axis;          // 九轴
    snode_t menu_system;
    snode_t menu_exit;

    menu_node_t shortcutmenu;	// 快捷菜单
    menu_node_t mainmenu1;		// 主菜单1
    menu_node_t mainmenu2;		// 主菜单2
    menu_node_t image_adjust;   // 图像调节
    menu_node_t image_setting;  // 图像设置

    coord_node_t cross_pos;
} devctx_t;

typedef struct {
    int osd_width;              // osd 分辨率
    int osd_height;
    int sensor_width;           // 探测器分辨率
    int sensor_height;
    int fpga_width;             // 机芯输出分辨率
    int fpga_height;
    int pip_width;              // pip 分辨率
    int pip_height;
    int pip_width_in_sensor;    // pip 在探测器坐标系下的分辨率
    int pip_height_in_sensor;
    int pip_change_pos;
} res_info_t;

typedef struct {
    char gui_ver[8];        // gui 版本号
    char sys_ver[32];       // rootfs 版本号
    char boot_ver[8];       // boot 版本号
    char fpga_sw_ver[4];    // 机芯版本号
    char fpga_pn_sn[32];    // 机芯 SN 和 PN 码
    char hw_ver[8];         // 硬件版本号
    char pn[16];            // 产品 PN 码
    char sn[16];            // 产品 SN 码
    char ssid[16];          // 产品 ssid
    char model_name[16];    // 产品型号名称
    char wifi_passwd[16];   // 产品 wifi 密码
    char mac[32];           // mac 地址
} sw_info_t;

typedef struct __GLOABLE_OBJECT__ {
    int curid;
    void *pgui;
    devctx_t devctx;
    res_info_t res_info;
    sw_info_t sys_info;
    float w_zoom;
    float h_zoom;
} UICtx_t;

typedef struct __SETUP_FUNC__ {
    unsigned keyval;
    int (*func_ptr)(void *p);
} SETUP_FUNC;

typedef struct __STATE_FUNC_ID__ {
    SETUP_FUNC  func_id[KEY_NULL + 1];	
} STATE_FUNC_ID;

UICtx_t *getUICtx(void);
int Init_UICtx(UICtx_t *pobj);
int handle_event(UICtx_t * pobj, eKeyVal keyval);
unsigned int onExit();
int create_200ms_thread(UICtx_t *pobj);

#endif